<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <!-- 
        1、什么时候使用闭包
            项目开发中，重复使用一个变量，又不想变量污染，我们就可以使用闭包

        2、 闭包的作用
            使一个外部函数有权限访问一个内部函数作用域

        3、 闭包的产生条件
​		        1、需要访问作用域（外部函数访问内部函数作用域）
​               2、函数嵌套（子元素要访问父元素的变量）
​               3、被嵌套函数在另一个作用域中被调用（把子函数return出去，外部作用域才能使用）
       4、 闭包的缺点(延长父函数的生命周期，因为子函数会调用父函数的变量)
           比普通函数闭包对内存占用多，建议使用完毕后，手动赋值空标记fn = null
     -->
    <script>
      // 函数内部使用函数外部的变量，作用域链决定的
      //   var n = 999;
      //   function f1() {
      //     alert(n);
      //   }
      //   f1();

      //   布局变量，只能函数内部的作用域使用，外部不能用
      //   function f1() {
      //     var n = 999;
      //     // 布局变量，只能函数内部的作用域使用
      //   }
      //   f1();
      //   alert(n);

      //   如何从外部读取局部变量?
      //   function f1() {
      //     var a = 1;
      //     function f2() {
      //       console.log(a);
      //     }
      //     return f2;
      //   }
      //   var a = f1();
      //   a();

      //   function f1() {
      //     var a = 1;
      //     function f2() {
      //       return a++;
      //     }

      //     return f2;
      //   }

      //   var a = f1();
      //   console.log(a);
      //   console.log(a);
      //   console.log(a);

      //   console.log(f1()());
      //   console.log(f1()());
      //   var a = f1();
      //   console.log(a());
      //   console.log(a());

      //   function nAdd() {
      //     n += 1;
      //   }
      //   var nAdd = function () {
      //     n += 1;
      //   };

      //   function f1() {
      //     var n = 999;
      //     nAdd = function () {
      //       n += 1;
      //     };

      //     function f2() {
      //       alert(n);
      //     }
      //     return f2;
      //   }

      //   var result = f1();
      //   result(); // 999
      //   result(); // 999
      //   nAdd();
      //   result = null;
      //   result();
    </script>
  </body>
</html>
